/* Copyright (c) 2001-2008, The HSQL Development Group
 * All rights reserved.
 *
 * Redistribution and use _in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * Redistributions of source code must retain the above copyright notice, this
 * list of conditions and the following disclaimer.
 *
 * Redistributions _in binary form must reproduce the above copyright notice,
 * this list of conditions and the following disclaimer _in the documentation
 * and/or other materials provided with the distribution.
 *
 * Neither the name of the HSQL Development Group nor the names of its
 * contributors may be used to endorse or promote products derived from this
 * software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG,
 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */


using System;
using System.Security.Cryptography.X509Certificates;
using EffiProz.Core.Lib;
using EffiProz.Core.Resources;


namespace EffiProz.Server
{

    // fredt@users 20020215 - patch 1.7.0 by fredt
    // method rorganised to use new HsqlServerProperties class
    // unsaved@users 20021113 - patch 1.7.2 - SSL support
    // boucherb@users 20030510 - patch 1.7.2 - SSL support moved to factory interface
    // boucherb@users 20030510 - patch 1.7.2 - moved all common code to Server
    // boucherb@users 20030510 - patch 1.7.2 - general lint removal

    /**
     *  The HSQLDB HTTP protocol network database server. <p>
     *
     *  WebServer has two distinct functions:<p>
     *
     *  The primary function is to allow client/server access to HSQLDB databases
     *  via the HTTP protocol. This protocol is less efficient than the HSQL
     *  protocol used by the Server class and should be used only _in situations
     *  where sandboxes or firewalls between the client and the server do not
     *  allow the use of the HSQL protocol. One example is client/server access by
     *  an applet running _in browsers on remote hosts and accessing the database
     *  engine on the HTTP server from which the applet originated. From version
     *  1.7.2, HTTP database connections are persistent and support transactions.
     *  Similar to HSQL connections, they should be explicitly closed to free the
     *  server resources. <p>
     *
     *  The secondary function of WebServer is to act as a simple general purpose
     *  HTTP server. It is aimed to support the minimum requirements set _out by
     *  the HTTP/1.0 standard. The HEAD and GET methods can be used to query and
     *  retreive static files from the HTTP server.<p>
     *
     *  Both the database server and HTTP server functions of WebServer can be
     *  configured with the webserver.properties file. It contains entries for the
     *  database server similar to those for the HSQL protocol Server class. In
     *  addition, a list mapping different file endings to their mime types may be
     *  included _in this file. (fredt@users) <p>
     *
     * From the command line, the options are as follows: <p>
     * <pre>
     * +----------------+-------------+----------+------------------------------+
     * |    OPTION      |    TYPE     | DEFAULT  |         DESCRIPTION          |
     * +----------------+-------------+----------+------------------------------|
     * | -?             | --          | --       | prints this message          |
     * | -address       | name|number | any      | server inet address          |
     * | -port          | number      | 80       | port at which server listens |
     * | -database.i    | [type]spec  | 0=test   | path of database i           |
     * | -dbname.i      | alias       | --       | url alias for database i     |
     * | -silent        | true|false  | true     | false => display all queries |
     * | -trace         | true|false  | false    | display JDBC trace messages  |
     * | -no_system_exit| true|false  | false    | do not issue System.exit()   |
     * +----------------+-------------+----------+------------------------------+
     * </pre>
     *
     *  Example of the webserver.properties file:
     *
     * <pre>
     * server.port=80
     * server.database.0=test
     * server.dbname.0=...
     * ...
     * server.database.n=...
     * server.dbname.n=...
     * server.silent=true
     *
     * .htm=text/html
     * .html=text/html
     * .txt=text/plain
     * .gif=image/gif
     * .class=application/octet-stream
     * .jpg=image/jpeg
     * .jgep=image/jpeg
     * .zip=application/x-zip-compressed
     * </pre>
     *
     * <ul>
     *   <li>For server.root, use '/'  as the separator, even for DOS/Windows.
     *   <li>File extensions for mime types must be lowercase and start with '.'
     * </ul>
     *
     * Replaces original Hypersonic class of the same name.
     *
     * @author fredt@users
     * @author boucherb@users
     * @version 1.7.2
     * @since 1.7.2
     */
    public class WebServer : Server
    {

        /**
         * Handle to resource bundle providing i18n for things like
         * HTTP error pages.
        // */
        public static int webBundleHandle = BundleHandler.getBundleHandle2("EffiProz.Server.Resources.Webserver",
            typeof(WebServer).Assembly);

        public WebServer() : base(ServerConstants.SC_PROTOCOL_HTTP)
        {
           
        }

        public WebServer(X509Certificate serverCertificate)
            : base(ServerConstants.SC_PROTOCOL_HTTP,serverCertificate)
        {          
        }
       
        /**
         * Retrieves the name of the web page served when no page is specified.
         * This attribute is relevant only when server protocol is HTTP(S).
         *
         * @return the name of the web page served when no page is specified
         *
         * @jmx.managed-attribute
         *  access="read-write"
         *  description="Used when server protocol is HTTP(S)"
         */
        public override string getDefaultWebPage()
        {
            return serverProperties.getProperty(
                ServerConstants.SC_KEY_WEB_DEFAULT_PAGE);
        }

        /**
         * Retrieves a string object describing the command line and
         * properties options for this Server.
         *
         * @return the command line and properties options help for this Server
         */
        public override string getHelpString()
        {
            return BundleHandler.getString(serverBundleHandle, "webserver.help");
        }

        /**
         * Retrieves this server's product name.  <p>
         *
         * Typically, this will be something like: "HSQLDB xxx server".
         *
         * @return the product name of this server
         *
         * @jmx.managed-attribute
         *  access="read-only"
         *  description="Of Server"
         */
        public override string getProductName()
        {
            return "EffiProz web server";
        }

        /**
         * Retrieves a string respresentaion of the network protocol
         * this server offers, typically one of 'HTTP', HTTPS', 'HSQL' or 'HSQLS'.
         *
         * @return string respresentation of this server's protocol
         *
         * @jmx.managed-attribute
         *  access="read-only"
         *  description="Used to handle connections"
         */
        public override string getProtocol()
        {
            return isTls() ? "HTTPS"
                           : "HTTP";
        }

        /**
         * Retrieves the root context (directory) from which web content
         * is served.  This property is relevant only when the server
         * protocol is HTTP(S).  Although unlikely, it may be that _in the future
         * other contexts, such as jar urls may be supported, so that pages can
         * be served from the contents of a jar or from the JVM class path.
         *
         * @return the root context (directory) from which web content is served
         *
         * @jmx.managed-attribute
         *  access="read-write"
         *  description="Context (directory)"
         */
        public override string getWebRoot()
        {
            return serverProperties.getProperty(ServerConstants.SC_KEY_WEB_ROOT);
        }
    }
}
